package com.sky.webSocket;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * WebSocket服务
 */
@Component
@ServerEndpoint("/ws/{sid}")
@Slf4j
public class WebSocketServer {

    // 存放所有会话对象，使用ConcurrentHashMap保证线程安全
    private static Map<String, Session> sessionMap = new ConcurrentHashMap<>();
    // 存放管理员会话
    private static Map<String, Session> adminSessionMap = new ConcurrentHashMap<>();

    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("sid") String sid) {
        log.info("客户端：{} 建立连接", sid);
        sessionMap.put(sid, session);
        // 如果是管理员连接，添加到管理员会话map
        if (sid.startsWith("admin_")) {
            adminSessionMap.put(sid, session);
        }
    }

    /**
     * 收到客户端消息后调用的方法
     */
    @OnMessage
    public void onMessage(String message, @PathParam("sid") String sid) {
        log.info("收到来自客户端：{} 的信息:{}", sid, message);
    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose(@PathParam("sid") String sid) {
        log.info("连接断开:{}", sid);
        sessionMap.remove(sid);
        if (sid.startsWith("admin_")) {
            adminSessionMap.remove(sid);
        }
    }

    /**
     * 发送消息给所有在线管理员
     */
    public void sendToAllAdmins(Object message) {
        String jsonMessage = JSON.toJSONString(message);
        Collection<Session> adminSessions = adminSessionMap.values();
        
        if (adminSessions.isEmpty()) {
            log.warn("没有在线管理员");
            return;
        }

        for (Session session : adminSessions) {
            try {
                if (session.isOpen()) {
                    session.getBasicRemote().sendText(jsonMessage);
                }
            } catch (Exception e) {
                log.error("发送消息给管理员失败", e);
            }
        }
        log.info("向所有在线管理员发送消息：{}", jsonMessage);
    }

    /**
     * 群发消息给所有客户端
     */
    public void sendToAllClient(Object message) {
        String jsonMessage = JSON.toJSONString(message);
        Collection<Session> sessions = sessionMap.values();
        for (Session session : sessions) {
            try {
                if (session.isOpen()) {
                    session.getBasicRemote().sendText(jsonMessage);
                }
            } catch (Exception e) {
                log.error("群发消息失败", e);
            }
        }
        log.info("群发消息：{}", jsonMessage);
    }
}
